package priv.conceit.sc.hoxton.common.util;

import java.util.Arrays;
import java.util.List;
import java.util.Random;
import java.util.UUID;

/**
 * sc-hoxton 随机生成工具类
 *
 * @author Conceit
 * 2020/5/19 增加方法
 * @since 1.0.0, 2020/5/19
 */
public class RandomUtil {

	/**
	 * 生成指定长度的短编码 可用于文件短编码或者短uri
	 * 去除0，O，1，I这四个容易混淆的字符
	 * <p>
	 * 24个大写字母，8个数字， 32个字符
	 * <p>
	 * 随机生成6个 概率为
	 * 32^6约10亿
	 * <p>
	 * 随机生成5个 概率为
	 * 32^5约3000万
	 * <p>
	 * 随机生成4个 概率为
	 * 32^4约1048万
	 *
	 * @param length 生成的长度
	 * @author conceit
	 * @date 2020/5/19 15:30
	 */
	public static String getShortCode(int length) {
		List<Character> characters =
				Arrays.asList('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K', 'L', 'M',
						'N', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
						'2', '3', '4', '5', '6', '7', '8', '9');
		Random random = new Random();
		StringBuilder stringBuilder = new StringBuilder();
		for (int i = 0; i < length; i++) {
			int index = random.nextInt(characters.size());
			stringBuilder.append(characters.get(index));
		}
		return stringBuilder.toString();
	}


	/**
	 * 生成一个唯一的id（UUID）32位
	 *
	 * @param isRemoveDash 是否去掉横杠
	 * @return String
	 * @author conceit
	 * @date 2020/5/19 15:30
	 */
	public static String getUUID(boolean isRemoveDash) {
		if (isRemoveDash) {
			return UUID.randomUUID().toString().trim().replaceAll("-", "");
		}
		return UUID.randomUUID().toString();
	}

	/**
	 * 生产指定位数的数字随机验证码
	 *
	 * @param length 长度
	 * @return String
	 * @author conceit
	 * @date 2020/5/19 15:30
	 */
	public static String getNumVerifyCode(Integer length) {
		StringBuffer code = new StringBuffer();
		Random random = new Random();
		for (int i = 0; i < length; i++) {
			code.append(String.valueOf(random.nextInt(10)));
		}
		return code.toString();
	}

	/**
	 * 生产指定位数 英文加数字随机验证码
	 *
	 * @param length 长度
	 * @return String
	 * @author conceit
	 * @date 2020/5/19 15:30
	 */
	public static String getInviteCode(Integer length) {

		StringBuffer code = new StringBuffer();

		int need = length;

		Random random = new Random();
		for (int i = need; i > 0; i--) {
			Boolean isWord = random.nextBoolean();
			if (isWord) {
				int a = random.nextInt(26) + 97;
				code.append((char) a);
			} else {
				int b = random.nextInt(10);
				code.append(b);
			}
		}

		return code.toString().toUpperCase();
	}
}
